import os

#设置全局变量
GUnitTuple = ("KB","MB","GB",'TB') #单位元组



#自定义函数获取目标文件大小
def getFileSize(fileName):
    '''
        获取目标文件夹大小
        fileName         :   目标文件名称
        return（size）  :   目标文件字节数
    '''
#begin getDIRSize
    size = 0.0 #初始化返回值
    if(os.path.exists(fileName)):#判断目标是否存在
        if(os.path.isfile(fileName)): #如果只是一个文件名,直接返回该文件大小
            size = os.path.getsize(fileName)
        elif(os.path.isdir(fileName)): #如果是个文件目录,就循环内容
            fList = os.listdir(fileName)
            for item in fList:
                targetName = os.path.join(fileName,item) #拼接文件名
                size += getFileSize(targetName)  #直接递归      
        else:
            size = 0.0
    else:
        print("目标文件【{}】不存在！".format(fileName))

    return size        
#end getDIRSize

#自定义字节计算结果
def getFormatFileSize(fileName):
    '''
        格式化显示结果
        fileName         :   目标文件名称
        return(str_result)   :   结果字符串
    '''
#begin getFormatFileSize
    str_result = "目标{} 计算结果为：{:,}{}【{:,}字节】" #设定返回模板
    i = 1
    str_unit = GUnitTuple[0] #初始化单位
    num_size = getFileSize(fileName)

    if (num_size > 0): #判断文件大小是否为0
        num_result = num_size / 1024.0 #首次除以1024 ,获取该文件KB值
        while (num_result > 1024.0): #若结果大于1024,则继续
            str_unit = GUnitTuple[i] #获取下一个单位
            num_result = (num_size / 1024.0)
            i+=1        
            if(i > 3): #当前单位到达TB时,无论如何都跳出
                break
        
        num_result = round(num_result,2) #四舍五入,保留两位小数

    return str_result.format(os.path.abspath(fileName),num_result,str_unit,num_size)
#end getFormatFileSize

    
#显示目标文件大小计算结果
def showFileSize():
    '''
        显示目标文件大小计算结果
    '''
#begin showFileSize
    str_fileName = input("请输入当前目录需要计算的文件名(如键入为空则计算当前目录)：")
    if(len(str_fileName) == 0):
        str_fileName = os.getcwd()
    print(getFormatFileSize(str_fileName))
    print("感谢本次使用！")
#end showFileSize


#测试功能
# str_fileSize = getFormatFileSize('aa')
# print(str_fileSize)
showFileSize()
